// chatroom/test/test_utils.c
#include <stdio.h>  // 引入标准输入输出库，用于使用 printf 函数输出测试信息
#include <string.h> // 引入字符串处理库，用于使用 strlen 和 strcmp 函数
#include <assert.h> // 引入断言库，用于在测试中验证条件是否满足

// 被测试的函数
// 声明 trim_newline 函数，该函数用于去除字符串末尾的换行符
size_t trim_newline(char *str);

/**
 * 测试 trim_newline 函数的不同场景
 * 
 * 该函数包含多个测试用例，用于验证 trim_newline 函数在不同输入下的行为，
 * 包括字符串以单个换行符结尾、以多个换行符结尾、不以换行符结尾、
 * 空字符串、字符串中间有换行符以及仅包含一个换行符等情况。
 */
void test_trim_newline() {
    // 测试用例1: 字符串以单个换行符结尾
    {
        // 初始化一个以单个换行符结尾的字符串
        char str[] = "Hello World\n";
        // 获取原始字符串的长度
        size_t original_len = strlen(str);
        // 调用 trim_newline 函数处理字符串，并获取处理后的长度
        size_t new_len = trim_newline(str);
        
        // 断言处理后的长度是否等于原始长度减 1
        assert(new_len == original_len - 1);
        // 断言处理后的字符串内容是否符合预期
        assert(strcmp(str, "Hello World") == 0);
        // 若上述断言都通过，输出测试通过信息
        printf("测试1通过：字符串末尾有单个换行符\n");
    }
    
    // 测试用例2: 字符串以多个换行符结尾(只应去掉最后一个)
    {
        // 初始化一个以多个换行符结尾的字符串
        char str[] = "Hello World\n\n";
        // 获取原始字符串的长度
        size_t original_len = strlen(str);
        // 调用 trim_newline 函数处理字符串，并获取处理后的长度
        size_t new_len = trim_newline(str);
        
        // 断言处理后的长度是否等于原始长度减 1
        assert(new_len == original_len - 1);
        // 断言处理后的字符串内容是否符合预期
        assert(strcmp(str, "Hello World\n") == 0);
        // 若上述断言都通过，输出测试通过信息
        printf("测试2通过：字符串末尾有多个换行符\n");
    }
    
    // 测试用例3: 字符串不以换行符结尾
    {
        // 初始化一个不以换行符结尾的字符串
        char str[] = "Hello World";
        // 获取原始字符串的长度
        size_t original_len = strlen(str);
        // 调用 trim_newline 函数处理字符串，并获取处理后的长度
        size_t new_len = trim_newline(str);
        
        // 断言处理后的长度是否等于原始长度
        assert(new_len == original_len);
        // 断言处理后的字符串内容是否符合预期
        assert(strcmp(str, "Hello World") == 0);
        // 若上述断言都通过，输出测试通过信息
        printf("测试3通过：字符串末尾无换行符\n");
    }
    
    // 测试用例4: 空字符串
    {
        // 初始化一个空字符串
        char str[] = "";
        // 调用 trim_newline 函数处理字符串，并获取处理后的长度
        size_t new_len = trim_newline(str);
        
        // 断言处理后的长度是否为 0
        assert(new_len == 0);
        // 断言处理后的字符串内容是否符合预期
        assert(strcmp(str, "") == 0);
        // 若上述断言都通过，输出测试通过信息
        printf("测试4通过：空字符串\n");
    }
    
    // 测试用例5: 字符串中间有换行符但不以换行符结尾
    {
        // 初始化一个中间有换行符但不以换行符结尾的字符串
        char str[] = "Hello\nWorld";
        // 获取原始字符串的长度
        size_t original_len = strlen(str);
        // 调用 trim_newline 函数处理字符串，并获取处理后的长度
        size_t new_len = trim_newline(str);
        
        // 断言处理后的长度是否等于原始长度
        assert(new_len == original_len);
        // 断言处理后的字符串内容是否符合预期
        assert(strcmp(str, "Hello\nWorld") == 0);
        // 若上述断言都通过，输出测试通过信息
        printf("测试5通过：字符串中间有换行符但不以换行符结尾\n");
    }
    
    // 测试用例6: 字符串仅包含一个换行符
    {
        // 初始化一个仅包含一个换行符的字符串
        char str[] = "\n";
        // 调用 trim_newline 函数处理字符串，并获取处理后的长度
        size_t new_len = trim_newline(str);
        
        // 断言处理后的长度是否为 0
        assert(new_len == 0);
        // 断言处理后的字符串内容是否符合预期
        assert(strcmp(str, "") == 0);
        // 若上述断言都通过，输出测试通过信息
        printf("测试6通过：字符串仅包含一个换行符\n");
    }
}

/**
 * 程序入口函数
 * 
 * 调用 test_trim_newline 函数执行测试用例，
 * 并返回 0 表示程序正常结束。
 * 
 * return int 始终返回 0 表示程序正常结束
 */
int main() {
    // 调用测试函数执行测试
    test_trim_newline();
    // 返回 0 表示程序正常结束
    return 0;
}
//gcc -Wall -Wextra -std=c11 -o test_utils c:/Users/Mutual/wj/chatroom/test/test_utils.c c:/Users/Mutual/wj/chatroom/client/utils.c